<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文帮助: 有关移动的命令</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/motion.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>motion</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="motion.txt">motion.txt</a> </b>    适用于 Vim 9.0 版本。   最近更新: 2022年9月


                  <code class="vim">VIM 参考手册    by Bram Moolenaar</code>
                                <code class="vim">译者</code>: Willis


光标移动                                        <b class="vimtag"> <a name="cursor-motions">cursor-motions</a> </b> <b class="vimtag"> <a name="navigation">navigation</a> </b>

这些命令用于移动光标。如果新的位置离开了当前显示范围，屏幕将滚动到合适的位置，
使得光标可见 (参见 <a href="options.html#'scrolljump'">'scrolljump'</a> 和 <a href="options.html#'scrolloff'">'scrolloff'</a> 选项)。

1. 动作和操作符                  <a href="motion.html#operator">operator</a> 
2. 左右动作                      <a href="motion.html#left-right-motions">left-right-motions</a> 
3. 上下动作                      <a href="motion.html#up-down-motions">up-down-motions</a> 
4. 单词动作                      <a href="motion.html#word-motions">word-motions</a> 
5. 文本对象动作                  <a href="motion.html#object-motions">object-motions</a> 
6. 文本对象选择                  <a href="motion.html#object-select">object-select</a> 
7. 位置标记                      <a href="motion.html#mark-motions">mark-motions</a> 
8. 跳转                          <a href="motion.html#jump-motions">jump-motions</a> 
9. 其他动作                      <a href="motion.html#various-motions">various-motions</a> 

概论:

如果你想知道在当前文件所在的位置，可以用 "<code class="keystroke">CTRL-G</code>" 命令  <a href="editing.html#CTRL-G">CTRL-G</a>  或者
"g <code class="keystroke">CTRL-G</code>" 命令  <a href="editing.html#g_CTRL-G">g_CTRL-G</a> 。如果你置位了 <a href="options.html#'ruler'">'ruler'</a> 选项，光标位置会在状态行上保
持更新 (Vim 会因此稍慢一些)。

有经验的用户更喜欢 hjkl 键，因为它们就在自己的手指下面。初学者则倾向于光标移动
键，因为他们不知道 hjkl 键做什么。看看键盘的布局就很容易记住 hjkl 的意义。把 j
想象成一个向下的箭头就可以了。

置位 <a href="options.html#'virtualedit'">'virtualedit'</a> 选项使得光标可以移动到还没有字符或者在占据多列的字符中间某
个位置 (如在制表符内部)。

</section><hr class="doubleline" /><section class=inner>
<h4>1. 动作和操作符                                         <b class="vimtag"> <a name="operator">operator</a> </b></h4>
动作命令出现在操作符之后，从而使操作符作用于被该动作所跨越的文本之上。也就
是，在动作之前和之后的光标位置之间的文本。一般的，操作符用来删除或者改变文本。
下面列出所有的操作符:

         <a href="change.html#c">c</a>      c       修改 (change)
         <a href="change.html#d">d</a>      d       删除 (delete)
         <a href="change.html#y">y</a>      y       抽出 (yank) 到寄存器 (不改变文本)
         <a href="change.html#%7E">~</a>      ~       变换大小写 (只有当 <a href="options.html#'tildeop'">'tildeop'</a> 置位时有效)
         <a href="change.html#g%7E">g~</a>     g~      变换大小写
         <a href="change.html#gu">gu</a>     gu      变为小写
         <a href="change.html#gU">gU</a>     gU      变为大写
         <a href="change.html#!">!</a>      !       通过外部程序过滤
         <a href="change.html#%20">=</a>      =       通过 <a href="options.html#'equalprg'">'equalprg'</a> (若为空，C-indenting) 过滤
         <a href="change.html#gq">gq</a>     gq      文本排版
         <a href="change.html#gw">gw</a>     gw      文本排版，不移动光标
         <a href="change.html#g?">g?</a>     g?      ROT13 编码
         <a href="change.html#%3E">&gt;</a>      &gt;       右移
         <a href="change.html#%3C">&lt;</a>      &lt;       左移
         <a href="fold.html#zf">zf</a>     zf      定义折叠
         <a href="map.html#g@">g@</a>     g@      调用 <a href="options.html#'operatorfunc'">'operatorfunc'</a> 选项定义的函数
                                                <b class="vimtag"> <a name="motion-count-multiplied">motion-count-multiplied</a> </b>
如果动作包括一个次数而操作符之前也有一个的话，两者相乘。因此，"2d3w" 删除六个
单词。
                                                <b class="vimtag"> <a name="operator-doubled">operator-doubled</a> </b>
重叠操作符使之成为行操作。如果使用计数，不管是在首字符之前还是之后，操作对象是
对应的行数。因此， <code class="badlink">3dd</code>  删除三行。首字符之前和之后的计数会相乘，因此  <code class="badlink">2y3y</code>  抽
出六行。

大多数情况下，光标在应用操作符后停在被操作的文本的起始处。例如，"yfe" 不移动光
标，而 "yFe" 则向左移动光标到抽出的文本的起始的那个 "e" 上。

                                                <b class="vimtag"> <a name="linewise">linewise</a> </b> <b class="vimtag"> <a name="characterwise">characterwise</a> </b>
操作符或者影响开始和结束位置之间的整行或者字符区间。一般说来，在行间移动的动作
影响整行 (或者说面向行的)，而在行内移动的动作影响字符区间 (或者说面向字符的)。
但是有例外。

                                                <b class="vimtag"> <a name="exclusive">exclusive</a> </b> <b class="vimtag"> <a name="inclusive">inclusive</a> </b>
面向字符的动作或者是闭的，或者是开的。闭动作的开始和结束位置包含在操作范围里。
开动作中，靠近缓冲区尾端的末个字符不被包含在内。面向行的动作总包含开始和结尾的
位置。

下面的命令里总会提到动作是行的、开的、或是闭的。不过，有两个一般的特例:
1. 如果一个开动作的结尾应在首列，那么，它会前移到上一行的尾处，并成为一个闭动
   作。例如，"}" 移动到一个段落之后的首行。但 "d}" 不会包含那一行。
                                                <b class="vimtag"> <a name="exclusive-linewise">exclusive-linewise</a> </b>
2. 如果一个开动作的结尾应在第一列，而它的开始在一行的首个非空白字符之前或之
   上，那么它会转换成一个行动作。例如，如果一个段落以若干空白开始，而你在第一
   个非空白字符上执行 "d}"，那么该段落的所有行都被删除，包括之前的空白。如果你
   再放置 (put)，那么删除的行将插在光标之下。

请 <code class="note">注意</code> 如果操作符处于等待状态 (键入了操作符命令但还没有键入动作)，将应用一组
特别的映射命令。参见  <a href="map.html#:omap">:omap</a> 。

除了先给出操作符再给出动作的方式以外，你还可以用可视模式: 先用 "v" 标记文本的
开始处，移动光标到文本的末尾，然后再输入操作符。开始和当前光标位置之间的文本以
高亮显示，从而你可以直观地看到要操作的文本。这种方式提供了更多的自由，但代价是
更多的键击而且重做不易。参见可视模式的章节  <a href="visual.html#Visual-mode">Visual-mode</a> 。

你可以用 ":" 命令定义一个动作。例如，"d:call FindEnd()"。
不过如果命令多于一行，该操作不能用 "." 重复。例如，可以重复: 
<code class="example">        d:call search("f")&lt;CR&gt;</code>
但不能重复: 
<code class="example">        d:if 1&lt;CR&gt;</code>
<code class="example">           call search("f")&lt;CR&gt;</code>
<code class="example">        endif&lt;CR&gt;</code>
<code class="note">注意</code> ":" 的使用使任何动作变成面向字符。


                                                                <b class="vimtag"> <a name="forced-motion">forced-motion</a> </b>
强 制 一 个 动 作 面 向 行、面 向 字 符 或 者 面 向 可 视 列 块

如果一个动作不是你希望使用的类型，你可以在操作符后用 "v"、"V" 或者 <code class="keystroke">CTRL-V</code> 来
强制转换类型。
示例: 
<code class="example">        dj</code>
删除两行 
<code class="example">        dvj</code>
删除当前光标位置到光标下方字符之间字符 
<code class="example">        d&lt;C-V&gt;j</code>
删除光标所在和光标下方的字符。

把面向行的动作强制为面向字符或者列块时要<code class="note">注意</code>，列不一定总有定义。

                                                        <b class="vimtag"> <a name="o_v">o_v</a> </b>
v               在操作符后和动作命令之前应用: 即使该动作是面向行的，也强制该操
                作面向字符。如果它应是面向行的，则变成开动作。如果已经是面向字
                符的，则在开/闭间切换。这可以使一个开动作成为闭的，或者使一个
                闭动作成为开的。

                                                        <b class="vimtag"> <a name="o_V">o_V</a> </b>
V               在操作符后和动作命令之前应用: 即使该动作是面向字符的，也强制该
                操作面向行。

                                                        <b class="vimtag"> <a name="o_CTRL-V">o_CTRL-V</a> </b>
<code class="keystroke">CTRL-V</code>          在操作符后和动作命令之前应用: 强制该动作面向列块。这类似于可视
                列块模式的选择，由动作之前和之后的光标位置定义两个角落。

</section><hr class="doubleline" /><section class=inner>
<h4>2. 左右动作                                             <b class="vimtag"> <a name="left-right-motions">left-right-motions</a> </b></h4>
这些命令移动光标到当前行的指定列。除了 "$" 之外 (有可能跨越多行)，它们最多停在
该行的第一列或者行尾。<a href="options.html#'whichwrap'">'whichwrap'</a> 选项可以使其中的一些命令跨越行的边界。

h               或                                      <b class="vimtag"> <a name="h">h</a> </b>
<code class="special">&lt;Left&gt;</code>          或                                      <b class="vimtag"> <a name="%3CLeft%3E">&lt;Left&gt;</a> </b>
<code class="keystroke">CTRL-H</code>          或                                      <b class="vimtag"> <a name="CTRL-H">CTRL-H</a> </b> <b class="vimtag"> <a name="%3CBS%3E">&lt;BS&gt;</a> </b>
<code class="special">&lt;BS&gt;</code>                    向左 <code class="special">[count]</code> 个字符。 <a href="motion.html#exclusive">exclusive</a>  开动作。
                        <code class="note">注意</code>: 如果你希望 <code class="special">&lt;BS&gt;</code> 删除字符，使用如下映射:
                                :map <code class="keystroke">CTRL-V</code><code class="special">&lt;BS&gt;</code>         X
                        (要输入 "<code class="keystroke">CTRL-V</code><code class="special">&lt;BS&gt;</code>" 先敲 <code class="keystroke">CTRL-V</code> 键，紧跟一个 <code class="special">&lt;BS&gt;</code> 键)
                        如果 <code class="special">&lt;BS&gt;</code> 和希望的操作不符，查阅  <a href="options.html#:fixdel">:fixdel</a> 。

l               或                                      <b class="vimtag"> <a name="l">l</a> </b>
<code class="special">&lt;Right&gt;</code>         或                                      <b class="vimtag"> <a name="%3CRight%3E">&lt;Right&gt;</a> </b> <b class="vimtag"> <a name="%3CSpace%3E">&lt;Space&gt;</a> </b>
<code class="special">&lt;Space&gt;</code>                 向右 <code class="special">[count]</code> 个字符。 <a href="motion.html#exclusive">exclusive</a>  开动作。
                        关于调整行尾的行为，参见 <a href="options.html#'whichwrap'">'whichwrap'</a> 选项

                                                        <b class="vimtag"> <a name="0">0</a> </b>
0                       到行的首个字符。 <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                        <b class="vimtag"> <a name="%3CHome%3E">&lt;Home&gt;</a> </b> <b class="vimtag"> <a name="%3CkHome%3E">&lt;kHome&gt;</a> </b>
<code class="special">&lt;Home&gt;</code>                  到行的首个字符。 <a href="motion.html#exclusive">exclusive</a>  开动作。上下移动时，停在相
                        同的文本列 (如果可能的话)，与之对照，多数其它命令则保
                        持在相同的 <code class="emphasis">屏幕</code> 列上。和 "1|" 类似。如果一行以 <code class="special">&lt;Tab&gt;</code>
                        开头，则和 "0" 有区别。

                                                        <b class="vimtag"> <a name="^">^</a> </b>
^                       到行的首个非空白字符。 <a href="motion.html#exclusive">exclusive</a>  开动作。忽略任何计
                        数。

                                                        <b class="vimtag"> <a name="$">$</a> </b> <b class="vimtag"> <a name="%3CEnd%3E">&lt;End&gt;</a> </b> <b class="vimtag"> <a name="%3CkEnd%3E">&lt;kEnd&gt;</a> </b>
$ 或 <code class="special">&lt;End&gt;</code>              到行尾。如果给出 <code class="special">[count]</code>，则先往下走 [count-1] 行或尽
                        可能远。 <a href="motion.html#inclusive">inclusive</a>  闭动作。如果 count 为 2 或更高而光
                        标在末行上，报错而光标不移动。
                        可视模式下，光标移到紧贴该行末个字符之后的位置。
                        如果置位了 <a href="options.html#'virtualedit'">'virtualedit'</a>，"$" 可从行尾之后的空白后退到
                        行尾。

                                                        <b class="vimtag"> <a name="g_">g_</a> </b>
g_                      往下 [count-1] 行并到该行的末个非空白字符。
                         <a href="motion.html#inclusive">inclusive</a>  闭动作。

                                                        <b class="vimtag"> <a name="g0">g0</a> </b> <b class="vimtag"> <a name="g%3CHome%3E">g&lt;Home&gt;</a> </b>
g0 或 g<code class="special">&lt;Home&gt;</code>           如果设置了行回绕 (<a href="options.html#'wrap'">'wrap'</a> 打开): 到屏幕行的首个字符。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。如果一文本行不能在屏幕上完全显示，
                        和 "0" 有所不同。
                        如果没有设置 (<a href="options.html#'wrap'">'wrap'</a> 关闭): 到该行屏幕显示范围的最左
                        面的字符。如果该行首个字符不在屏幕上，则和 "0" 有所
                        不同。

                                                        <b class="vimtag"> <a name="g^">g^</a> </b>
g^                      如果设置了行回绕 (<a href="options.html#'wrap'">'wrap'</a> 打开): 到屏幕行的首个非空白字
                        符。 <a href="motion.html#exclusive">exclusive</a>  开动作。如果一文本行不能在屏幕上完全显
                        示，和 "^" 有所不同。
                        如果没有设置 (<a href="options.html#'wrap'">'wrap'</a> 关闭): 到该行屏幕显示范围的最左面
                        的非空白字符。如果该行首个字符不在屏幕上，则和 "^" 有
                        所不同。

                                                        <b class="vimtag"> <a name="gm">gm</a> </b>
gm                      和 "g0" 类似，但 (尽可能) 向右移到屏幕显示宽度的中间位
                        置。

                                                        <b class="vimtag"> <a name="gM">gM</a> </b>
gM                      和 "g0" 类似，但到行文本的中间位置。
                        带计数时: 行文本的此百分比位置。
                        因而，"10gM" 是接近文本的开始处，而 "90gM" 是接近文本
                        的结尾处。

                                                        <b class="vimtag"> <a name="g$">g$</a> </b> <b class="vimtag"> <a name="g%3CEnd%3E">g&lt;End&gt;</a> </b>
g$  或  g<code class="special">&lt;End&gt;</code>          如果设置了行回绕 (<a href="options.html#'wrap'">'wrap'</a> 打开): 往下 [count-1] 屏幕行
                        并到该屏幕行的行尾。 <a href="motion.html#inclusive">inclusive</a>  闭动作。如果一文本行不
                        能在屏幕上完全显示，它和 "$" 就会有不同。
                        如果没有设置 (<a href="options.html#'wrap'">'wrap'</a> 关闭): 到该行屏幕显示范围的最右面
                        的字符。如果该行的行尾字符不可见，则它和 "$" 就有不
                        同。另外，垂直移动保持所在的列，而不是移到行尾。
                        打开 <a href="options.html#'virtualedit'">'virtualedit'</a> 时移动到屏幕行尾。

                                                        <b class="vimtag"> <a name="bar">bar</a> </b>
|                       到当前行的 <code class="special">[count]</code> 屏幕列。 <a href="motion.html#exclusive">exclusive</a>  开动作。
                        Ceci n'est pas une pipe (<code class="vim">译者注</code>: 法语 这不是一只烟斗，
                        这是名句，pipe 也做管道讲，有双关义)。

                                                        <b class="vimtag"> <a name="f">f</a> </b>
f<code class="special">{char}</code>                 到右侧第 <code class="special">[count]</code> 次出现的字符 <code class="special">{char}</code>。光标放在 <code class="special">{char}</code>
                        上。 <a href="motion.html#inclusive">inclusive</a>  闭动作。
                        <code class="special">{char}</code> 可以输入二合字母  <a href="change.html#digraph-arg">digraph-arg</a> 。
                        如果 <a href="options.html#'encoding'">'encoding'</a> 设为 Unicode，则可以输入组合字符，参见
                         <a href="mbyte.html#utf-8-char-arg">utf-8-char-arg</a> 。
                        <code class="special">{char}</code> 要进行  <a href="map.html#:lmap">:lmap</a>  映射。插入模式下的 <code class="keystroke">CTRL-^</code> 命令可
                        以用来切换这一点  <a href="insert.html#i_CTRL-^">i_CTRL-^</a> 。

                                                        <b class="vimtag"> <a name="F">F</a> </b>
F<code class="special">{char}</code>                 到左侧第 <code class="special">[count]</code> 次出现的字符 <code class="special">{char}</code>。
                        光标放在 <code class="special">{char}</code> 上。 <a href="motion.html#exclusive">exclusive</a>  开动作。
                        <code class="special">{char}</code> 可以和  <a href="motion.html#f">f</a>  命令相同的方式输入。

                                                        <b class="vimtag"> <a name="t">t</a> </b>
t<code class="special">{char}</code>                 直到右侧第 <code class="special">[count]</code> 次出现的字符 <code class="special">{char}</code> 之前。光标放在
                        <code class="special">{char}</code> 左边的位置。 <a href="motion.html#inclusive">inclusive</a>  闭动作。
                        <code class="special">{char}</code> 可以和  <a href="motion.html#f">f</a>  命令相同的方式输入。

                                                        <b class="vimtag"> <a name="T">T</a> </b>
T<code class="special">{char}</code>                 直到左侧第 <code class="special">[count]</code> 次出现的字符 <code class="special">{char}</code> 之后。光标放在
                        <code class="special">{char}</code> 右侧的位置。 <a href="motion.html#exclusive">exclusive</a>  开动作。
                        <code class="special">{char}</code> 可以和  <a href="motion.html#f">f</a>  命令相同的方式输入。

                                                        <b class="vimtag"> <a name=";">;</a> </b>
;                       重复上次的 f、t、F 或者 T 命令 <code class="special">[count]</code> 次。见  <a href="options.html#cpo-;">cpo-;</a> 

                                                        <b class="vimtag"> <a name=",">,</a> </b>
,                       反方向重复上次的 f、t、F 或者 T 命令 <code class="special">[count]</code> 次。另见
                         <a href="options.html#cpo-;">cpo-;</a> 

</section><hr class="doubleline" /><section class=inner>
<h4>3. 上下动作                                             <b class="vimtag"> <a name="up-down-motions">up-down-motions</a> </b></h4>
k               或                                      <b class="vimtag"> <a name="k">k</a> </b>
<code class="special">&lt;Up&gt;</code>            或                                      <b class="vimtag"> <a name="%3CUp%3E">&lt;Up&gt;</a> </b> <b class="vimtag"> <a name="CTRL-P">CTRL-P</a> </b>
<code class="keystroke">CTRL-P</code>                  向上 <code class="special">[count]</code> 行。 <a href="motion.html#linewise">linewise</a>  行动作。

j               或                                      <b class="vimtag"> <a name="j">j</a> </b>
<code class="special">&lt;Down&gt;</code>          或                                      <b class="vimtag"> <a name="%3CDown%3E">&lt;Down&gt;</a> </b>
<code class="keystroke">CTRL-J</code>          或                                      <b class="vimtag"> <a name="CTRL-J">CTRL-J</a> </b>
<code class="special">&lt;NL&gt;</code>            或                                      <b class="vimtag"> <a name="%3CNL%3E">&lt;NL&gt;</a> </b> <b class="vimtag"> <a name="CTRL-N">CTRL-N</a> </b>
<code class="keystroke">CTRL-N</code>                  向下 <code class="special">[count]</code> 行。 <a href="motion.html#linewise">linewise</a>  行动作。

gk              或                                      <b class="vimtag"> <a name="gk">gk</a> </b> <b class="vimtag"> <a name="g%3CUp%3E">g&lt;Up&gt;</a> </b>
g<code class="special">&lt;Up&gt;</code>                   向上 <code class="special">[count]</code> 显示行。 <a href="motion.html#exclusive">exclusive</a>  开动作。
                        在行回绕和操作符之后与 'k' 不同，因为后者不是面向行
                        的。

gj              或                                      <b class="vimtag"> <a name="gj">gj</a> </b> <b class="vimtag"> <a name="g%3CDown%3E">g&lt;Down&gt;</a> </b>
g<code class="special">&lt;Down&gt;</code>                 向下 <code class="special">[count]</code> 显示行。 <a href="motion.html#exclusive">exclusive</a>  开动作。
                        在行回绕和操作符之后与 'j' 不同，因为后者不是面向行
                        的。

                                                        <b class="vimtag"> <a name="-">-</a> </b>
-  <code class="special">&lt;minus&gt;</code>              向上 <code class="special">[count]</code> 行，停在首个非空白字符上。 <a href="motion.html#linewise">linewise</a>  行动
                        作。

+               或                                      <b class="vimtag"> <a name="+">+</a> </b>
<code class="keystroke">CTRL-M</code>          或                                      <b class="vimtag"> <a name="CTRL-M">CTRL-M</a> </b> <b class="vimtag"> <a name="%3CCR%3E">&lt;CR&gt;</a> </b>
<code class="special">&lt;CR&gt;</code>                    向下 <code class="special">[count]</code> 行，停在首个非空白字符上。 <a href="motion.html#linewise">linewise</a>  行动
                        作。

                                                        <b class="vimtag"> <a name="_">_</a> </b>
_  <code class="special">&lt;underscore&gt;</code>         向下 <code class="special">[count]</code> - 1 行，停在首个非空白字符上。 <a href="motion.html#linewise">linewise</a> 
                        行动作。

                                                        <b class="vimtag"> <a name="G">G</a> </b>
G                       到第 <code class="special">[count]</code> 行，缺省是末行， <a href="motion.html#linewise">linewise</a>  行动作。
                        如果没有置位 <a href="options.html#'startofline'">'startofline'</a>，保持同列，不然，停在首个非
                        空白字符上。
                        G 是  <a href="motion.html#jump-motions">jump-motions</a>  之一。

                                                        <b class="vimtag"> <a name="%3CC-End%3E">&lt;C-End&gt;</a> </b>
<code class="special">&lt;C-End&gt;</code>                 到第 <code class="special">[count]</code> 行，缺省是末行；并停在末个字符上。
                         <a href="motion.html#inclusive">inclusive</a>  闭动作。

<code class="special">&lt;C-Home&gt;</code>        或                                      <b class="vimtag"> <a name="gg">gg</a> </b> <b class="vimtag"> <a name="%3CC-Home%3E">&lt;C-Home&gt;</a> </b>
gg                      到第 <code class="special">[count]</code> 行，缺省是首行， <a href="motion.html#linewise">linewise</a>  行动作。
                        如果没有置位 <a href="options.html#'startofline'">'startofline'</a>，保持同列，不然，停在首个非
                        空白字符上。

                                                        <b class="vimtag"> <a name=":[range]">:[range]</a> </b>
:<code class="special">[range]</code>                把光标移到 <code class="special">[range]</code> 的末行。<code class="special">[range]</code> 也可以是单独一个行
                        号，如 ":1" 或 ":'m"。
                        和  <a href="motion.html#G">G</a>  不同，此命令不修改  <a href="motion.html#jumplist">jumplist</a> 。
                                                        <b class="vimtag"> <a name="N%">N%</a> </b>
<code class="special">{count}</code>%                到文件的 <code class="special">{count}</code> 百分比处并停在行的首个非空白字符上，
                         <a href="motion.html#linewise">linewise</a>  行动作。新的行号计算方法如下:
                            (<code class="special">{count}</code> * 总行数 + 99) / 100
                        另见 <a href="options.html#'startofline'">'startofline'</a>。

:<code class="special">[range]</code>go[to] <code class="special">[count]</code>                                  <b class="vimtag"> <a name=":go">:go</a> </b> <b class="vimtag"> <a name=":goto">:goto</a> </b> <b class="vimtag"> <a name="go">go</a> </b>
<code class="special">[count]</code>go               到缓冲区的第 <code class="special">[count]</code> 个字节。缺省的 <code class="special">[count]</code> 是 1，即文
                        件开始处。如果给定 <code class="special">[range]</code>，则最后的一个数字用作字节的
                        序号。<a href="options.html#'fileformat'">'fileformat'</a> 的当前设置决定如何计算换行符的个
                        数。
                        另见  <a href="builtin.html#line2byte()">line2byte()</a>  函数和 <a href="options.html#'statusline'">'statusline'</a> 的 'o' 选项。
                        <code class="notvi">{仅当编译时加入  <a href="various.html#+byte_offset">+byte_offset</a>  特性才有效}</code>

这些命令移动到特定的行上，到首行或者末行时移动会停止。起先两个命令的光标停留在
最后一个改变列号的命令所指定的列上 (如果可能的话)。"$" 命令除外，这时，光标总
会停在一行的行尾。

如果 "k"、"-" 或 <code class="keystroke">CTRL-P</code> 使用时给出 <code class="special">[count]</code>，而光标上方的行数小于 <code class="special">[count]</code> 且
<a href="options.html#'cpo'">'cpo'</a> 选项包含了 "-" 标志位，报错  <a href="options.html#cpo--">cpo--</a> 。

</section><hr class="doubleline" /><section class=inner>
<h4>4. 单词动作                                             <b class="vimtag"> <a name="word-motions">word-motions</a> </b></h4>
<code class="special">&lt;S-Right&gt;</code>       或                                      <b class="vimtag"> <a name="%3CS-Right%3E">&lt;S-Right&gt;</a> </b> <b class="vimtag"> <a name="w">w</a> </b>
w                       正向 <code class="special">[count]</code> 个单词。 <a href="motion.html#exclusive">exclusive</a>  开动作。

<code class="special">&lt;C-Right&gt;</code>       或                                      <b class="vimtag"> <a name="%3CC-Right%3E">&lt;C-Right&gt;</a> </b> <b class="vimtag"> <a name="W">W</a> </b>
W                       正向 <code class="special">[count]</code> 个字串。 <a href="motion.html#exclusive">exclusive</a>  开动作。
                        如果 <code class="special">&lt;C-Right&gt;</code> 不工作，检查一下  <a href="term.html#arrow_modifiers">arrow_modifiers</a> 。

                                                        <b class="vimtag"> <a name="e">e</a> </b>
e                       正向到第 <code class="special">[count]</code> 个单词的尾部。 <a href="motion.html#inclusive">inclusive</a>  闭动作。
                        不停留在空行上。

                                                        <b class="vimtag"> <a name="E">E</a> </b>
E                       正向到第 <code class="special">[count]</code> 个字串的尾部。 <a href="motion.html#inclusive">inclusive</a>  闭动作。
                        不停留在空行上。

<code class="special">&lt;S-Left&gt;</code>        或                                      <b class="vimtag"> <a name="%3CS-Left%3E">&lt;S-Left&gt;</a> </b> <b class="vimtag"> <a name="b">b</a> </b>
b                       反向 <code class="special">[count]</code> 个单词。 <a href="motion.html#exclusive">exclusive</a>  开动作。

<code class="special">&lt;C-Left&gt;</code>        或                                      <b class="vimtag"> <a name="%3CC-Left%3E">&lt;C-Left&gt;</a> </b> <b class="vimtag"> <a name="B">B</a> </b>
B                       反向 <code class="special">[count]</code> 个字串。 <a href="motion.html#exclusive">exclusive</a>  开动作。
                        如果 <code class="special">&lt;C-Left&gt;</code> 不工作，检查一下  <a href="term.html#arrow_modifiers">arrow_modifiers</a> 。

                                                        <b class="vimtag"> <a name="ge">ge</a> </b>
ge                      反向到第 <code class="special">[count]</code> 个单词的尾部。 <a href="motion.html#inclusive">inclusive</a>  闭动作。

                                                        <b class="vimtag"> <a name="gE">gE</a> </b>
gE                      反向到第 <code class="special">[count]</code> 个字串的尾部。 <a href="motion.html#inclusive">inclusive</a>  闭动作。

这些命令在单词或字串间移动。
                                                        <b class="vimtag"> <a name="word">word</a> </b>
一个单词由字符、数字和下划线序列或者其他的非空白字符的序列组成。单词间可以空白
字符 (空格、制表、换行) 分隔。这一规则可以用 <a href="options.html#'iskeyword'">'iskeyword'</a> 选项改变。空行也被认
作单词。
                                                        <b class="vimtag"> <a name="WORD">WORD</a> </b>
一个字串由非空白字符序列组成。字串以空白分隔。空行也被认作字串。

已折叠的行序列被认作由单个字符组成的单词。"w" 和 "W"、"e" 和 "E" 移动到折叠行
之后的首个单词或字串的开始/结尾处。"b" 和 "B" 移动到折叠之前的首个单词的开始
处。

特例: 如果光标在非空白字符上，"cw" 和 "cW" 等价于 "ce" 和 "cE"。这是因为 "cw"
被诠释为 修改-单词 (change-word)，而单词并不包括后续的空格。

另外一个特例: 如果 "w" 动作带操作符并且该动作的最后一个单词在行尾，则该操作范
围结束于行尾而非下一行的首个单词。

原始 Vi 的 "e" 实现有问题。例如，如果前一行为空而光标停在后一行的首个字符的
话，"e" 就会卡在那里，但是你用 "2e" 就很正常。Vim 里就不是，"ee" 和 "2e" 有相
同的行为，这更合乎逻辑。不过，这造成了 Vi 和 Vim 小小的不兼容。

</section><hr class="doubleline" /><section class=inner>
<h4>5. 文本对象动作                                 <b class="vimtag"> <a name="object-motions">object-motions</a> </b></h4>
                                                        <b class="vimtag"> <a name="(">(</a> </b>
(                       反向 <code class="special">[count]</code> 个  <a href="motion.html#sentence">sentence</a> 。 <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                        <b class="vimtag"> <a name=")">)</a> </b>
)                       正向 <code class="special">[count]</code> 个  <a href="motion.html#sentence">sentence</a> 。 <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                        <b class="vimtag"> <a name="{">{</a> </b>
{                       反向 <code class="special">[count]</code> 个  <a href="motion.html#paragraph">paragraph</a> 。 <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                        <b class="vimtag"> <a name="}">}</a> </b>
}                       正向 <code class="special">[count]</code> 个  <a href="motion.html#paragraph">paragraph</a> 。 <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                        <b class="vimtag"> <a name="]]">]]</a> </b>
]]                      正向 <code class="special">[count]</code> 个  <a href="motion.html#section">section</a>  或到后一个出现在首列的 '{'。
                        如果用于操作符后，则同时停留在首列的 '}' 的下方。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。
                        <code class="note">注意</code>  <a href="motion.html#exclusive-linewise">exclusive-linewise</a>  常常适用。

                                                        <b class="vimtag"> <a name="][">][</a> </b>
][                      正向 <code class="special">[count]</code> 个  <a href="motion.html#section">section</a>  或到后一个出现在首列的 '}'。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。
                        <code class="note">注意</code>  <a href="motion.html#exclusive-linewise">exclusive-linewise</a>  常常适用。

                                                        <b class="vimtag"> <a name="[[">[[</a> </b>
[[                      反向 <code class="special">[count]</code> 个  <a href="motion.html#section">section</a>  或到前一个出现在首列的 '{'。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。
                        <code class="note">注意</code>  <a href="motion.html#exclusive-linewise">exclusive-linewise</a>  常常适用。
                                                        <b class="vimtag"> <a name="[]">[]</a> </b>
[]                      反向 <code class="special">[count]</code> 个  <a href="motion.html#section">section</a>  或到前一个出现在首列的 '}'。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。
                        <code class="note">注意</code>  <a href="motion.html#exclusive-linewise">exclusive-linewise</a>  常常适用。

这些命令在三类文本对象上移动，见下。

                                                        <b class="vimtag"> <a name="sentence">sentence</a> </b>
一个句子以 '.'、'!' 或者 '?' 结尾并紧随着一个换行符、空格或者制表符。结束标点
和空白字符之间可以出现任何数量的闭括号和引号: ')'、']'、'"' 和 '''。段落和小节
的边界也视为句子的边界。
如果 <a href="options.html#'cpoptions'">'cpoptions'</a> 包含 'J' 标志位，那么标点之后的空格至少要出现两个，而且制表符
不被视为空白字符。

                                                        <b class="vimtag"> <a name="paragraph">paragraph</a> </b>
一个段落以每个空行或段落宏命令开始，段落宏由 <a href="options.html#'paragraphs'">'paragraphs'</a> 选项里成对出现的字符
所定义。它的缺省值为 "IPLPPPQPP TPHPLIPpLpItpplpipbp"，也就是宏 ".IP"、".LP"
等 (这些是 nroff 宏，所以句号一定要出现在第一列)。小节边界也被视为段落边界。
<code class="note">注意</code> 空白行 (只包含空白的行)  <code class="emphasis">不是</code>  段落边界。
也要 <code class="note">注意</code>: 这不包括首列出现的 '{' 或 '}'。但如果 <a href="options.html#'cpoptions'">'cpoptions'</a> 里包含 '{' 标志
位，那么首列 '{' 可用作段落边界  <a href="vi_diff.html#posix">posix</a> 。

                                                        <b class="vimtag"> <a name="section">section</a> </b>
一个小节以每个首列出现的换页符 (<code class="special">&lt;C-L&gt;</code>) 或小节宏命令开始。小节宏由 <a href="options.html#'sections'">'sections'</a>
选项里成对出现的字符所定义。它的缺省值是 "SHNHH HUnhsh"，也就是宏 ".SH"、
".NH"、".H"、".HU"、".nh" 和 ".sh"。

"]]" 和 "[[" 命令停在首列出现的 '{' 上。这有助于在 C 程序里找到函数的开始位
置。要找到首列出现的 '}'，C 函数的末尾，可用 "][" (正向) 或 "[]" (反向)。
<code class="note">注意</code>: 命令的第一个字符决定搜索的方向。

如果你的 '{' 或 '}' 不在第一列但是你还是希望用 "[[" 和 "]]" 来找它们，试试这些
映射: 
<code class="example">   :map [[ ?{&lt;CR&gt;w99[{</code>
<code class="example">   :map ][ /}&lt;CR&gt;b99]}</code>
<code class="example">   :map ]] j0[[%/{&lt;CR&gt;</code>
<code class="example">   :map [] k$][%?}&lt;CR&gt;</code>
[照文本直接输入，参见  <a href="intro.html#%3C%3E">&lt;&gt;</a> ]

</section><hr class="doubleline" /><section class=inner>
<h4>6. 文本对象选择                                 <b class="vimtag"> <a name="object-select">object-select</a> </b> <b class="vimtag"> <a name="text-objects">text-objects</a> </b></h4>                                                <b class="vimtag"> <a name="v_a">v_a</a> </b> <b class="vimtag"> <a name="v_i">v_i</a> </b>

这里是一系列只能在可视模式或操作符后使用的命令。这些命令或以 "a" 打头，代表选
择一个 ("a"n) 包含空白的对象；或以 "i" 带头，代表选择内含 ("i"nner) 对象: 它们
不包含空白。另外，空白本身也是内含对象。这样，"内含" 对象总比 "一个" 对象选择
较少的文本。

这些命令只有在编译时加入  <a href="various.html#+textobjects">+textobjects</a>  特性后才有效。
另见  <a href="visual.html#gn">gn</a>  和  <a href="visual.html#gN">gN</a> ，操作对象是前次搜索模式。
                                                        <b class="vimtag"> <a name="v_aw">v_aw</a> </b> <b class="vimtag"> <a name="aw">aw</a> </b>
aw                      "一个单词"，选择 <code class="special">[count]</code> 个单词 (见  <a href="motion.html#word">word</a> )。
                        包括开头或拖尾的空白，但不单独计算。
                        在可视面向行的模式下，"aw" 切换到可视面向字符的模式。

                                                        <b class="vimtag"> <a name="v_iw">v_iw</a> </b> <b class="vimtag"> <a name="iw">iw</a> </b>
iw                      "内含单词"，选择 <code class="special">[count]</code> 个单词 (见  <a href="motion.html#word">word</a> )。
                        单词之间的空白也被算为一个单词。
                        在可视面向行的模式下，"iw" 切换到可视面向字符的模式。

                                                        <b class="vimtag"> <a name="v_aW">v_aW</a> </b> <b class="vimtag"> <a name="aW">aW</a> </b>
aW                      "一个字串"，选择 <code class="special">[count]</code> 个字串 (见  <a href="motion.html#WORD">WORD</a> )。
                        包括开头或拖尾的空白，但不单独计算。
                        在可视面向行的模式下，"aW" 切换到可视面向字符的模式。

                                                        <b class="vimtag"> <a name="v_iW">v_iW</a> </b> <b class="vimtag"> <a name="iW">iW</a> </b>
iW                      "内含字串"，选择 <code class="special">[count]</code> 个字串 (见  <a href="motion.html#WORD">WORD</a> )。
                        字串之间的空白也被算为一个字串。
                        在可视面向行的模式下，"iW" 切换到可视面向字符的模式。

                                                        <b class="vimtag"> <a name="v_as">v_as</a> </b> <b class="vimtag"> <a name="as">as</a> </b>
as                      "一个句子"，选择 <code class="special">[count]</code> 个句子 (见  <a href="motion.html#sentence">sentence</a> )。
                        可视模式下切换为面向字符的模式。

                                                        <b class="vimtag"> <a name="v_is">v_is</a> </b> <b class="vimtag"> <a name="is">is</a> </b>
is                      "内含句子"，选择 <code class="special">[count]</code> 个句子 (见  <a href="motion.html#sentence">sentence</a> )。
                        可视模式下切换为面向字符的模式。

                                                        <b class="vimtag"> <a name="v_ap">v_ap</a> </b> <b class="vimtag"> <a name="ap">ap</a> </b>
ap                      "一个段落"，选择 <code class="special">[count]</code> 个段落 (见  <a href="motion.html#paragraph">paragraph</a> )。
                        特例: 空白行 (只包含空白的行) 也被视为段落边界。
                        可视模式下切换为面向行的模式。

                                                        <b class="vimtag"> <a name="v_ip">v_ip</a> </b> <b class="vimtag"> <a name="ip">ip</a> </b>
ip                      "内含段落"，选择 <code class="special">[count]</code> 个段落 (见  <a href="motion.html#paragraph">paragraph</a> )。
                        特例: 空白行 (只包含空白的行) 也被视为段落边界。
                        可视模式下切换为面向行的模式。

a]                                              <b class="vimtag"> <a name="v_a]">v_a]</a> </b> <b class="vimtag"> <a name="v_a[">v_a[</a> </b> <b class="vimtag"> <a name="a]">a]</a> </b> <b class="vimtag"> <a name="a[">a[</a> </b>
a[                      "一个 [] 块"，选择 <code class="special">[count]</code> 层 '[' ']' 块。为此，先反向
                        查找第 <code class="special">[count]</code> 个未匹配的 '['，然后查找其相应的 ']'。
                        两者之间的文本，包括 '[' 和 ']'，都被选择。
                        可视模式下切换为面向字符的模式。

i]                                              <b class="vimtag"> <a name="v_i]">v_i]</a> </b> <b class="vimtag"> <a name="v_i[">v_i[</a> </b> <b class="vimtag"> <a name="i]">i]</a> </b> <b class="vimtag"> <a name="i[">i[</a> </b>
i[                      "内含 [] 块"，选择 <code class="special">[count]</code> 层 '[' ']' 块。为此，先反向
                        查找第 <code class="special">[count]</code> 个未匹配的 '['，然后查找其相应的 ']'。
                        两者之间的文本，不包括 '[' 和 ']'，都被选择。
                        可视模式下切换为面向字符的模式。

a)                                                      <b class="vimtag"> <a name="v_a)">v_a)</a> </b> <b class="vimtag"> <a name="a)">a)</a> </b> <b class="vimtag"> <a name="a(">a(</a> </b>
a(                                                      <b class="vimtag"> <a name="vab">vab</a> </b> <b class="vimtag"> <a name="v_ab">v_ab</a> </b> <b class="vimtag"> <a name="v_a(">v_a(</a> </b> <b class="vimtag"> <a name="ab">ab</a> </b>
ab                      "一个块"，选择 <code class="special">[count]</code> 层块，从 "<code class="special">[count]</code> [(" 到其相应
                        的 ')'，包括 '(' 和 ')' (见  <a href="motion.html#[(">[(</a> )。并不包括括号之外的
                        空白。
                        可视模式下切换为面向字符的模式。

i)                                                      <b class="vimtag"> <a name="v_i)">v_i)</a> </b> <b class="vimtag"> <a name="i)">i)</a> </b> <b class="vimtag"> <a name="i(">i(</a> </b>
i(                                                      <b class="vimtag"> <a name="vib">vib</a> </b> <b class="vimtag"> <a name="v_ib">v_ib</a> </b> <b class="vimtag"> <a name="v_i(">v_i(</a> </b> <b class="vimtag"> <a name="ib">ib</a> </b>
ib                      "内含块"，选择 <code class="special">[count]</code> 层块，从 "<code class="special">[count]</code> [(" 到其相应
                        的 ')'，不包括 '(' 和 ')' (见  <a href="motion.html#[(">[(</a> )。如果光标不在 ()
                        块内，则寻找下一个 "("。
                        可视模式下切换为面向字符的模式。

a&gt;                                              <b class="vimtag"> <a name="v_a%3E">v_a&gt;</a> </b> <b class="vimtag"> <a name="v_a%3C">v_a&lt;</a> </b> <b class="vimtag"> <a name="a%3E">a&gt;</a> </b> <b class="vimtag"> <a name="a%3C">a&lt;</a> </b>
a&lt;                      "一个 <code class="special">&lt;&gt;</code> 块"，选择 <code class="special">[count]</code> 层 <code class="special">&lt;&gt;</code> 块，从反向第 <code class="special">[count]</code>
                        个未匹配的 '&lt;' 到其匹配的 '&gt;'，包括 '&lt;' 和 '&gt;'。
                        可视模式下切换为面向字符的模式。

i&gt;                                              <b class="vimtag"> <a name="v_i%3E">v_i&gt;</a> </b> <b class="vimtag"> <a name="v_i%3C">v_i&lt;</a> </b> <b class="vimtag"> <a name="i%3E">i&gt;</a> </b> <b class="vimtag"> <a name="i%3C">i&lt;</a> </b>
i&lt;                      "内含 <code class="special">&lt;&gt;</code> 块"，选择 <code class="special">[count]</code> 层 <code class="special">&lt;&gt;</code> 块，从反向第 <code class="special">[count]</code>
                        个未匹配的 '&lt;' 到其匹配的 '&gt;'，不包括 '&lt;' 和 '&gt;'。
                        可视模式下切换为面向字符的模式。

                                                <b class="vimtag"> <a name="v_at">v_at</a> </b> <b class="vimtag"> <a name="at">at</a> </b>
at                      "一个标签块"，选择 <code class="special">[count]</code> 层标签块。从反向第 <code class="special">[count]</code>
                        个未匹配的 "<code class="special">&lt;aaa&gt;</code>" 到其匹配的 "&lt;/aaa&gt;"，包括 "<code class="special">&lt;aaa&gt;</code>"
                        和 "&lt;/aaa&gt;"。
                        详情见  <a href="motion.html#tag-blocks">tag-blocks</a> 。
                        可视模式下切换为面向字符的模式。
                        仅当编译时加入  <a href="various.html#+eval">+eval</a>  特性时才可用。

                                                <b class="vimtag"> <a name="v_it">v_it</a> </b> <b class="vimtag"> <a name="it">it</a> </b>
it                      "内部标签块"，选择 <code class="special">[count]</code> 层标签块。从反向第 <code class="special">[count]</code>
                        个未匹配的 "<code class="special">&lt;aaa&gt;</code>" 到其匹配的 "&lt;/aaa&gt;"，不包括 "<code class="special">&lt;aaa&gt;</code>"
                        和 "&lt;/aaa&gt;"。
                        详情见  <a href="motion.html#tag-blocks">tag-blocks</a> 。
                        可视模式下切换为面向字符的模式。

a}                                                      <b class="vimtag"> <a name="v_a}">v_a}</a> </b> <b class="vimtag"> <a name="a}">a}</a> </b> <b class="vimtag"> <a name="a{">a{</a> </b>
a{                                                      <b class="vimtag"> <a name="v_aB">v_aB</a> </b> <b class="vimtag"> <a name="v_a{">v_a{</a> </b> <b class="vimtag"> <a name="aB">aB</a> </b>
aB                      "一个大块"，选择 <code class="special">[count]</code> 层大块，从 "<code class="special">[count]</code> [{" 到其
                        相应的 '}'，包括 '{' 和 '}' (见  <a href="motion.html#[{">[{</a> )。
                        可视模式下切换为面向字符的模式。

i}                                                      <b class="vimtag"> <a name="v_i}">v_i}</a> </b> <b class="vimtag"> <a name="i}">i}</a> </b> <b class="vimtag"> <a name="i{">i{</a> </b>
i{                                                      <b class="vimtag"> <a name="v_iB">v_iB</a> </b> <b class="vimtag"> <a name="v_i{">v_i{</a> </b> <b class="vimtag"> <a name="iB">iB</a> </b>
iB                      "内含大块"，选择 <code class="special">[count]</code> 层大块，从 "<code class="special">[count]</code> [{" 到其
                        相应的 '}'，不包括 '{' 和 '}' (见  <a href="motion.html#[{">[{</a> )。
                        可视模式下切换为面向字符的模式。

a"                                                      <b class="vimtag"> <a name="v_aquote">v_aquote</a> </b> <b class="vimtag"> <a name="aquote">aquote</a> </b>
a'                                                      <b class="vimtag"> <a name="v_a'">v_a'</a> </b> <b class="vimtag"> <a name="a'">a'</a> </b>
a`                                                      <b class="vimtag"> <a name="v_a`">v_a`</a> </b> <b class="vimtag"> <a name="a`">a`</a> </b>
                        "一个引号字符串"。选择前一个引号开始到后一个引号结束的
                        文本。<a href="options.html#'quoteescape'">'quoteescape'</a> 选项用于跳过转义的引号。
                        只在同一行内有效。
                        如果开始时光标在引号上，Vim 会从该行行首开始搜索，以决
                        定哪个引号对构成字符串。
                        包含任何拖尾的空白，如果没有拖尾的，也包含开头的空白。
                        可视模式下它切换为面向字符的模式。
                        在可视模式下重复此对象会包含另一个字符串。目前不使用计
                        数。

i"                                                      <b class="vimtag"> <a name="v_iquote">v_iquote</a> </b> <b class="vimtag"> <a name="iquote">iquote</a> </b>
i'                                                      <b class="vimtag"> <a name="v_i'">v_i'</a> </b> <b class="vimtag"> <a name="i'">i'</a> </b>
i`                                                      <b class="vimtag"> <a name="v_i`">v_i`</a> </b> <b class="vimtag"> <a name="i`">i`</a> </b>
                        类似于 a"、a' 和 a`，但不包括引号，而重复也不会扩展可
                        视选择区。
                        特例: 计数为 2 时包含引号，但不包括 a"/a'/a` 包含的额
                        外的空白。

在操作符之后:
非块对象:
        对于 "一个" 命令: 操作符作用于对象与其后的空白。如果其后没有空白或者光
        标位于对象之前的空白上的话，那么也包括对象之前的空白。
        对于 "内含" 命令: 如果光标在对象之上，那么操作符作用于该对象。如果光标
        在空白上，那么操作符作用于空白。
块对象:
        操作符作用于光标所在位置所在 (包括光标在括号上的特殊情况) 的块。对于
        "内含" 命令，不包含包围的括号。而对于 "一个" 命令，则包含之。

在可视模式下:
如果可视区域的起始和结束点在相同位置 (刚输入 "v"):
        选择一个区域，就和使用操作符一样。
如果可视区域的起始和结束点不同:
        若不是块对象，用一个对象或者到后一个对象之前的空白来扩展该区域，对于
        "一个" 命令，则两者都包含。扩展的方向决定于可视区域和光标的相对位置。
        若是块对象，该块向外扩展一层。

让我们用一系列删除命令来说明，删除的范围从小到大。请 <code class="note">注意</code> 对于单个字符和整行的
操作我们用了已有的 Vi 移动命令。
        "dl"    删除字符 (缩写: "x")                     <a href="change.html#dl">dl</a> 
        "diw"   删除内含单词                            <b class="vimtag"> <a name="diw">diw</a> </b>
        "daw"   删除一个单词                            <b class="vimtag"> <a name="daw">daw</a> </b>
        "diW"   删除内含字串 (见  <a href="motion.html#WORD">WORD</a> )                <b class="vimtag"> <a name="diW">diW</a> </b>
        "daW"   删除一个字串 (见  <a href="motion.html#WORD">WORD</a> )                <b class="vimtag"> <a name="daW">daW</a> </b>
        "dgn"   删除后一个前次搜索模式的匹配            <b class="vimtag"> <a name="dgn">dgn</a> </b>
        "dd"    删除一行                                 <a href="change.html#dd">dd</a> 
        "dis"   删除内含句子                            <b class="vimtag"> <a name="dis">dis</a> </b>
        "das"   删除一个句子                            <b class="vimtag"> <a name="das">das</a> </b>
        "dib"   删除内含 '(' ')' 块                     <b class="vimtag"> <a name="dib">dib</a> </b>
        "dab"   删除一个 '(' ')' 块                     <b class="vimtag"> <a name="dab">dab</a> </b>
        "dip"   删除内含段落                            <b class="vimtag"> <a name="dip">dip</a> </b>
        "dap"   删除一个段落                            <b class="vimtag"> <a name="dap">dap</a> </b>
        "diB"   删除内含 '{' '}' 大块                   <b class="vimtag"> <a name="diB">diB</a> </b>
        "daB"   删除一个 '{' '}' 大块                   <b class="vimtag"> <a name="daB">daB</a> </b>

请 <code class="note">注意</code> 移动命令和文本对象的区别。移动命令作用于这里 (光标当前位置) 到移动后的
位置。而对象的使用则会作用于整个对象，而和光标在对象的何处无关。例如，我们可以
比较 "dw" 和 "daw": "dw" 删除光标位置到后一个单词的起始处，"daw" 删除光标所在
的整个单词和其后或其前的空白。


标签块                                                  <b class="vimtag"> <a name="tag-blocks">tag-blocks</a> </b>

"it" 和 "at" 文本对象尝试选择 HTML 和 XML 的匹配标签之间的块。但因为它们并不完
全兼容，有一些限制。

通常的方法是选择 <code class="special">&lt;tag&gt;</code> 直到匹配的 &lt;/tag&gt; 为止的内容。"at" 包含标签，"it" 不包
含。不过重复 "it" 时标签仍然会包含 (不然不会有任何改变)。此外，在没有内容的标
签块上使用 "it" 会单独选择引导标签。

跳过 "&lt;aaa/&gt;" 项目。忽略大小写，即使对大小写应该敏感的 XML 也是如此。

HTML 里可以有 <code class="special">&lt;br&gt;</code> 或 &lt;meta ...&gt; 这样没有匹配结束标签的标签。它们被忽略。

这些文本对象能够容忍错误。单独出现的结束标签被忽略。

</section><hr class="doubleline" /><section class=inner>
<h4>7. 位置标记                                     <b class="vimtag"> <a name="mark-motions">mark-motions</a> </b> <b class="vimtag"> <a name="E20">E20</a> </b> <b class="vimtag"> <a name="E78">E78</a> </b></h4>
(<code class="vim">译者注</code>: 位置标记总结
- 文件内位置  <a href="motion.html#'a">'a</a>  - 'z
- 文件位置  <a href="motion.html#'A">'A</a>  - 'Z
- 前次及更早 Vim 离开位置  <a href="motion.html#'0">'0</a>  - '9
- 前次插入位置  <a href="motion.html#'^">'^</a> 
- 前次改变位置  <a href="motion.html#'.">'.</a> 
- 前次跳转位置 (上下文)  <a href="motion.html#''">''</a> 
- 前次缓冲区离开位置 |'"|
- 前次影响的文本区域  <a href="motion.html#'[">'[</a>  和  <a href="motion.html#']">']</a> 
- 可视选择区域  <a href="motion.html#'%3C">'&lt;</a>  和  <a href="motion.html#'%3E">'&gt;</a> 
- 当前句子  <a href="motion.html#'(">'(</a>  和  <a href="motion.html#')">')</a> 
- 当前段落  <a href="motion.html#'{">'{</a>  和  <a href="motion.html#'}">'}</a> 
)

跳转到一个位置标记有两种方法:
1. 用 ` (反引号):       光标放在指定的位置， <a href="motion.html#exclusive">exclusive</a>  开动作。
2. 用 ' (单引号):       光标放在指定位置所在行的首个非空字符上， <a href="motion.html#linewise">linewise</a>  行
                        动作。

                                                <b class="vimtag"> <a name="m">m</a> </b> <b class="vimtag"> <a name="mark">mark</a> </b> <b class="vimtag"> <a name="Mark">Mark</a> </b>
m<code class="special">{a-zA-Z}</code>               把位置标记 <code class="special">{a-zA-Z}</code> 设在当前光标位置 (不移动光标，这
                        不是动作命令)。

                                                <b class="vimtag"> <a name="m'">m'</a> </b> <b class="vimtag"> <a name="m`">m`</a> </b>
m'  或  m`              设置前次上下文标记。以后可以用 "''" 或者 "``" 跳转到
                        这个位置 (不移动光标，这不是动作命令)。

                                                <b class="vimtag"> <a name="m[">m[</a> </b> <b class="vimtag"> <a name="m]">m]</a> </b>
m[  或  m]              设置  <a href="motion.html#'[">'[</a>  或者  <a href="motion.html#']">']</a>  标记。可以用在执行多个命令的操作符
                        的定义中。(不移动光标，这不是动作命令)。

                                                <b class="vimtag"> <a name="m%3C">m&lt;</a> </b> <b class="vimtag"> <a name="m%3E">m&gt;</a> </b>
m&lt;  或  m&gt;              设置  <a href="motion.html#'%3C">'&lt;</a>  或者  <a href="motion.html#'%3E">'&gt;</a>  标记。可以用在改变  <a href="visual.html#gv">gv</a>  命令选择的
                        范围。(不移动光标，这不是动作命令)。
                        <code class="note">注意</code> 不能设置可视模式，只能设置开始和结束的位置。

                                                <b class="vimtag"> <a name=":ma">:ma</a> </b> <b class="vimtag"> <a name=":mark">:mark</a> </b> <b class="vimtag"> <a name="E191">E191</a> </b>
:<code class="special">[range]</code>ma[rk] {a-zA-Z'}
                        把位置标记 {a-zA-Z'} 设在 <code class="special">[range]</code> 的末行第 0 列。缺省
                        的 <code class="special">[range]</code> 是当前行。

                                                <b class="vimtag"> <a name=":k">:k</a> </b>
:<code class="special">[range]</code>k{a-zA-Z'}      和 :mark 相同，但是标记名之前的空格可以省略。
                        此命令在  <a href="vim9.html#Vim9">Vim9</a>  脚本里不支持，因为它太容易和变量名混淆
                        了。

                                                <b class="vimtag"> <a name="'">'</a> </b> <b class="vimtag"> <a name="'a">'a</a> </b> <b class="vimtag"> <a name="`">`</a> </b> <b class="vimtag"> <a name="`a">`a</a> </b>
'<code class="special">{a-z}</code>  `<code class="special">{a-z}</code>          跳转到当前缓冲区的位置标记 <code class="special">{a-z}</code>。

                                                <b class="vimtag"> <a name="'A">'A</a> </b> <b class="vimtag"> <a name="'0">'0</a> </b> <b class="vimtag"> <a name="`A">`A</a> </b> <b class="vimtag"> <a name="`0">`0</a> </b>
'<code class="special">{A-Z0-9}</code>  `<code class="special">{A-Z0-9}</code>    跳转到设置位置标记 <code class="special">{A-Z0-9}</code> 的文件所在的标记位置 (如果
                        切换到另外一个文件，这就不是动作命令)

                                                <b class="vimtag"> <a name="g'">g'</a> </b> <b class="vimtag"> <a name="g'a">g'a</a> </b> <b class="vimtag"> <a name="g`">g`</a> </b> <b class="vimtag"> <a name="g`a">g`a</a> </b>
g'<code class="special">{mark}</code>  g`<code class="special">{mark}</code>
                        跳转到指定的位置标记 <code class="special">{mark}</code>，但在当前缓冲区内跳转时，
                        不更改跳转表。示例: 
<code class="example">                                g`"</code>
                        跳转到当前文件最近的位置。参看
                        $VIMRUNTIME/vimrc_example.vim。另见  <a href="motion.html#:keepjumps">:keepjumps</a> 。

                                                <b class="vimtag"> <a name=":marks">:marks</a> </b>
:marks                  列出所有的位置标记 (这不是动作命令)，但不列出  <a href="motion.html#'(">'(</a> ，
                         <a href="motion.html#')">')</a> ， <a href="motion.html#'{">'{</a>  和  <a href="motion.html#'}">'}</a>  标记。
                        首列的编号为零。
                                                <b class="vimtag"> <a name="E283">E283</a> </b>
:marks <code class="special">{arg}</code>            列出所有 <code class="special">{arg}</code> 包含的位置标记 (这不是动作命令)。例
                        如， 
<code class="example">                                :marks aB</code>
                        列出位置标记 'a' 和 'B'。

                                                        <b class="vimtag"> <a name=":delm">:delm</a> </b> <b class="vimtag"> <a name=":delmarks">:delmarks</a> </b>
:delm[arks] <code class="special">{marks}</code>     删除指定的位置标记。可以删除的位置标记也包括 A-Z 或
                        0-9。不能删除 ' 位置标记。
                        指定的方式包括给出位置标记名的列表和使用连字符分隔的范
                        围。忽略空格。例如: 
<code class="example">                           :delmarks a        删除位置标记 a</code>
<code class="example">                           :delmarks a b 1    删除位置标记 a，b 和 1</code>
<code class="example">                           :delmarks Aa       删除位置标记 A 和 a</code>
<code class="example">                           :delmarks p-z      删除位置标记 p 到 z</code>
<code class="example">                           :delmarks ^.[]     删除位置标记 ^ . [ ]</code>
<code class="example">                           :delmarks \"       删除位置标记 "</code>
<code class="example"></code>
:delm[arks]!            删除当前缓冲区所有的位置标记，不包括 A-Z 或 0-9 位置标
                        记。

位置标记在任何情况下都是不可见的。它只是文件中一个被记住的位置。不要和命名的寄
存器混淆，两者毫不相干。

'a - 'z         小写位置标记，在每个文件内有效。
'A - 'Z         大写位置标记，也叫做文件标记，在文件间都有效。
'0 - '9         数字位置标记，在 .viminfo 文件里设置。

只要文件还在缓冲区列表里，就会记住小写位置标记 'a 到 'z。换而言之，如果在缓冲
区列表里删除一个文件，它的位置标记就消失了。如果删除包含某个位置标记的文本行，
这个位置标记也就随之消失。

小写位置标记可以和操作符合并使用。例如，"d't" 删除从光标位置到包含 't 标记的文
本行。提示: 用 't' 标记代表顶部 (Top)，'b' 标记代表底部 (Bottom)，等等。撤销/
重做时会复原小写位置标记。

大写位置标记 'A 到 'Z 包含了所在的文件名。可以用这些标记在文件间跳转。和操作符
合并使用的大写位置标记必须在当前文件里。即使插入/删除一些行或者同时在编辑别的
文件，此种标记的行号保持正确。如果 <a href="options.html#'viminfo'">'viminfo'</a> 选项不为空，在 .viminfo 文件中保
存大写位置标记。参阅  <a href="starting.html#viminfo-file-marks">viminfo-file-marks</a> 。

数字位置标记 '0 到 '9 很不一样。它们不是直接设置，而只能从 viminfo 文件
 <a href="starting.html#viminfo-file">viminfo-file</a>  中获取。简单的说，'0 是你上次离开 Vim 时的光标位置。'1 是再前一
次，等等。<a href="options.html#'viminfo'">'viminfo'</a> 的 'r' 标志可以指定不记录数字位置标记的文件。参见
 <a href="starting.html#viminfo-file-marks">viminfo-file-marks</a> 。


                                                        <b class="vimtag"> <a name="'[">'[</a> </b> <b class="vimtag"> <a name="`[">`[</a> </b>
'[  `[                  到上次改变或者抽出的文本的首个字符。

                                                        <b class="vimtag"> <a name="']">']</a> </b> <b class="vimtag"> <a name="`]">`]</a> </b>
']  `]                  到上次改变或者抽出文本的末个字符。

执行完操作符后，光标放在操作文本的开始。执行完放置命令 ("p" 或者 "P") 后，光标
有时放在首个被插入的行上，有时放在末个字符上。上述四个命令可以把光标放在两端的
任何一端。例如，在抽出 10 行后，你想要到跳转到其中最后一行: "10Y']"。在用 "p"
插入数行后你想跳到最底下的那行: "p']"。这同样适用于插入的文本。

<code class="note">备注</code>: 在删除文本后，除非是面向列块的可视模式，开始和结束的位置是重合的。如果当
前文件没有任何改动，这四个命令不会有任何作用。

                                                        <b class="vimtag"> <a name="'%3C">'&lt;</a> </b> <b class="vimtag"> <a name="`%3C">`&lt;</a> </b>
'&lt;  `&lt;                  到当前缓冲区前次选择可视区域的首行或首个字符。对于列块
                        模式而言，也可能是首行的末个字符 (为了能定义列块)。

                                                        <b class="vimtag"> <a name="'%3E">'&gt;</a> </b> <b class="vimtag"> <a name="`%3E">`&gt;</a> </b>
'&gt;  `&gt;                  到当前缓冲区前次选择可视区域的末行或末个字符。对于列块
                        模式而言，也可能是末行的首个字符 (为了能定义列块)。
                        <code class="note">注意</code> 这里适用 <a href="options.html#'selection'">'selection'</a>，该位置可能是刚刚在可视区域
                        之后的位置。

                                                        <b class="vimtag"> <a name="''">''</a> </b> <b class="vimtag"> <a name="``">``</a> </b>
''  ``                  到前次跳转之前或者上次 "m'" 或者 "m`" 命令给出的位置。
                        使用  <a href="motion.html#:keepjumps">:keepjumps</a>  命令修饰符时，该前次上下文标记不变。
                        另见  <a href="tips.html#restore-position">restore-position</a> 。

                                                        <b class="vimtag"> <a name="'quote">'quote</a> </b> <b class="vimtag"> <a name="`quote">`quote</a> </b>
'"  `"                  到前次离开本缓冲区时的光标位置。缺省是首行的首个字符。
                        参见  <a href="usr_05.html#last-position-jump">last-position-jump</a>  以了解如何对所有刚打开的文件
                        使用这个标记。每个缓冲区，而不是每个窗口，只有一个记住
                        的位置。只要这个缓冲区在某一个窗口可见，此标记不变。

                                                        <b class="vimtag"> <a name="'^">'^</a> </b> <b class="vimtag"> <a name="`^">`^</a> </b>
'^  `^                  到前次插入模式关闭的光标位置。 <a href="insert.html#gi">gi</a>  命令用到这个标记。
                        使用  <a href="motion.html#:keepjumps">:keepjumps</a>  命令修饰符时，此标记不变。

                                                        <b class="vimtag"> <a name="'.">'.</a> </b> <b class="vimtag"> <a name="`.">`.</a> </b>
'.  `.                  到前次改变的位置。这个位置位于或者接近于改变开始的地
                        方。有些命令引起几个改变，那么这个位置应该是接近于这个
                        命令最后改变的地方。例如，插入单词时，这个位置在末字符
                        上。
                        要跳转到较旧的改变，用  <a href="motion.html#g;">g;</a> 。

                                                        <b class="vimtag"> <a name="'(">'(</a> </b> <b class="vimtag"> <a name="`(">`(</a> </b>
'(  `(                  到当前句子的开始处，类似于  <a href="motion.html#(">(</a>  命令。

                                                        <b class="vimtag"> <a name="')">')</a> </b> <b class="vimtag"> <a name="`)">`)</a> </b>
')  `)                  到当前句子的结尾处，类似于  <a href="motion.html#)">)</a>  命令。

                                                        <b class="vimtag"> <a name="'{">'{</a> </b> <b class="vimtag"> <a name="`{">`{</a> </b>
'{  `{                  到当前段落的开始处，类似于  <a href="motion.html#{">{</a>  命令。

                                                        <b class="vimtag"> <a name="'}">'}</a> </b> <b class="vimtag"> <a name="`}">`}</a> </b>
'}  `}                  到当前段落的结尾处，类似于  <a href="motion.html#}">}</a>  命令。


这些命令不是标记本身，而是实现对某个标记的跳转:

                                                        <b class="vimtag"> <a name="]'">]'</a> </b>
]'                      <code class="special">[count]</code> 次光标下方后一个包含小写位置标记的行的首个非空
                        白字符。

                                                        <b class="vimtag"> <a name="]`">]`</a> </b>
]`                      <code class="special">[count]</code> 次光标后一个小写位置标记。

                                                        <b class="vimtag"> <a name="['">['</a> </b>
['                      <code class="special">[count]</code> 次到光标前前一个包含小写位置标记的行的首个非空
                        白字符。

                                                        <b class="vimtag"> <a name="[`">[`</a> </b>
[`                      <code class="special">[count]</code> 次光标前一个小写位置标记。


:loc[kmarks] <code class="special">{command}</code>                          <b class="vimtag"> <a name=":loc">:loc</a> </b> <b class="vimtag"> <a name=":lock">:lock</a> </b> <b class="vimtag"> <a name=":lockmarks">:lockmarks</a> </b>
                        执行命令 <code class="special">{command}</code>，并且不调整位置标记。可用于不影响行
                        数的文本改动。
                        <code class="note">警告</code>: 如果行数发生变化，那么在改变所在之下的标记仍然保
                        持它们的行号，从而实际上移到了别的行上。

                        行的插入/删除不会调整以下各项:
                        - 小写位置标记 'a - 'z
                        - 大写位置标记 'A - 'Z
                        - 数字位置标记 '0 - '9
                        - 前次插入位置  <a href="motion.html#'^">'^</a> 
                        - 前次改变位置  <a href="motion.html#'.">'.</a> 
                        - 前次影响的文本区域  <a href="motion.html#'[">'[</a>  和  <a href="motion.html#']">']</a> 
                        - 可视选择区域  <a href="motion.html#'%3C">'&lt;</a>  和  <a href="motion.html#'%3E">'&gt;</a> 
                        - 已设定的标号  <a href="sign.html#signs">signs</a>  的行号
                        -  <a href="quickfix.html#quickfix">quickfix</a>  位置的行号
                        - 跳转表  <a href="motion.html#jumplist">jumplist</a>  里的位置
                        - 标签堆栈  <a href="tagsrch.html#tagstack">tagstack</a>  里的位置
                        以下各项则总会被调整:
                        - 前次上下文标记  <a href="motion.html#''">''</a> 
                        - 光标位置
                        - 窗口或者缓冲区的视图
                        - 折叠  <a href="fold.html#folding">folding</a> 
                        - 差异视图  <a href="diff.html#diff">diff</a> 

:kee[pmarks] <code class="special">{command}</code>                          <b class="vimtag"> <a name=":kee">:kee</a> </b> <b class="vimtag"> <a name=":keep">:keep</a> </b> <b class="vimtag"> <a name=":keepmarks">:keepmarks</a> </b>
                        目前，这只对过滤命令  <a href="change.html#:range!">:range!</a>  有效:
                        - 如果过滤后的行数不少于过滤之前，那么所有的过滤行中的
                          标记保持行号不变。
                        - 如果行数减少，那么消失了的行中的标记就被删除掉。
                        在任何情况下，过滤文本之后的标记需要调整行号，以保持和
                        文本同步。
                        如果 <a href="options.html#'cpoptions'">'cpoptions'</a> 中没有 'R' 标志，那么直接执行过滤命令
                        和使用 ":keepmarks" 的效果一样。

                                                        <b class="vimtag"> <a name=":keepj">:keepj</a> </b> <b class="vimtag"> <a name=":keepjumps">:keepjumps</a> </b>
:keepj[umps] <code class="special">{command}</code>
                        在 <code class="special">{command}</code> 的移动不改变  <a href="motion.html#''">''</a> ， <a href="motion.html#'.">'.</a>  和  <a href="motion.html#'^">'^</a>  标记，跳
                        转表  <a href="motion.html#jumplist">jumplist</a>  或是改变表  <a href="motion.html#changelist">changelist</a> 。这对于自动改
                        变或者插入文本而不需要用户跳转到那个位置有用。例如，当
                        更新 "最近改变" 的时间标签: 
<code class="example"></code>
<code class="example">                                :let lnum = line(".")</code>
<code class="example">                                :keepjumps normal gg</code>
<code class="example">                                :call SetLastChange()</code>
<code class="example">                                :keepjumps exe "normal " .. lnum .. "G"</code>

                        <code class="note">注意</code> 必须为每个命令使用 ":keepjumps"。如果在命令里调用
                        了函数，则该函数里的命令仍然可能改变跳转表。另外，
                        ":keepjumps exe 'command '" 里的 "command" 不会保护跳
                        转表。应该用: ":exe 'keepjumps command'"

</section><hr class="doubleline" /><section class=inner>
<h4>8. 跳转                                         <b class="vimtag"> <a name="jump-motions">jump-motions</a> </b></h4>
"跳转" 是通常能移动光标数行之外的命令。如果你使光标 "跳转"，那么记住跳转之前的
光标位置。除非包含该位置的行被改变或者删除，可用 "''" 和 "``" 命令返回此位置。
以下命令是 "跳转" 命令: "'"、"`"、"G"、"/"、"?"、"n"、"N"、"%"、"("、")"、
"[["、"]]"、"{"、"}"、":s"、":tag"、"L"、"M"、"H" 和开始编辑新文件的命令。

                                                        <b class="vimtag"> <a name="CTRL-O">CTRL-O</a> </b>
<code class="keystroke">CTRL-O</code>                  转到跳转表里第 <code class="special">[count]</code> 个较旧的光标位置 (不是动作命
                        令)。

<code class="special">&lt;Tab&gt;</code>           或                                      <b class="vimtag"> <a name="CTRL-I">CTRL-I</a> </b> <b class="vimtag"> <a name="%3CTab%3E">&lt;Tab&gt;</a> </b>
<code class="keystroke">CTRL-I</code>                  转到跳转表里第 <code class="special">[count]</code> 个较新的光标位置 (不是动作命
                        令)。

                        <code class="note">备注</code>: 在 GUI 和支持  <a href="map.html#modifyOtherKeys">modifyOtherKeys</a>  的终端里，可以分
                        别对 <code class="keystroke">CTRL-I</code> 和 <code class="special">&lt;Tab&gt;</code> 进行映射，条件是 <code class="keystroke">CTRL-I</code> 映射出现
                        在 <code class="special">&lt;Tab&gt;</code> 之前，否则映射会同时应用于两者。

                                                        <b class="vimtag"> <a name=":ju">:ju</a> </b> <b class="vimtag"> <a name=":jumps">:jumps</a> </b>
:ju[mps]                打出跳转表 (不是动作命令)。

                                                        <b class="vimtag"> <a name=":cle">:cle</a> </b> <b class="vimtag"> <a name=":clearjumps">:clearjumps</a> </b>
:cle[arjumps]           清除当前窗口的跳转表。

                                                        <b class="vimtag"> <a name="jumplist">jumplist</a> </b>
跳转表用来记住跳转的位置。用 <code class="keystroke">CTRL-O</code> 和 <code class="keystroke">CTRL-I</code> 命令，你可以跳回到较早前的跳转位
置，然后在跳回来。这样，你就可以在这个列表上下移动。每个窗口有独立的跳转表，每
个表最多能存储 100 项。

例如，假定在三个跳转命令之后你有如下的跳转表:

<code class="section">    jump line  col file/text </code>
<code class="section">      3   1    0 一些文字 </code>
<code class="section">      2  70    0 另外一行 </code>
<code class="section">      1  1154   23 end. </code>
<code class="section">   &gt; </code>

"file/text" 列显示文件名，如果是当前文件，则显示跳转所在的文本 (为了能在窗口里
显示，去掉开头的缩排空白并截断过长的行)。

"&gt;" 标记指示跳转表的当前位置。如果用  <a href="various.html#:filter">:filter</a>  过滤  <a href="motion.html#:jumps">:jumps</a>  命令，该标记可能
不显示。

你现在位于第 1167 行。如果你用 <code class="keystroke">CTRL-O</code> 命令，光标会到第 1154 行。结果如下:

<code class="section">    jump line  col file/text </code>
<code class="section">      2   1    0 一些文字 </code>
<code class="section">      1  70    0 另外一行 </code>
<code class="section">   &gt;  0  1154   23 end. </code>
<code class="section">      1  1167    0 foo bar </code>

指针会指向前一次跳转的位置。后一个 <code class="keystroke">CTRL-O</code> 命令会使用更上面的那项。而后一个
<code class="keystroke">CTRL-I</code> 命令则会使用下面的那项。如果指针在末项之下，那说明你还没用过 <code class="keystroke">CTRL-I</code> 或
<code class="keystroke">CTRL-O</code> 命令。此时，<code class="keystroke">CTRL-O</code> 命令会把光标位置加到跳转表里，这样你以后就可以回到用
<code class="keystroke">CTRL-O</code> 之前的位置。在本例中，这是第 1167 行。

更多的 <code class="keystroke">CTRL-O</code> 命令会使你分别到第 70 和第 1 行。如果你用 <code class="keystroke">CTRL-I</code>，你又可以回到第
1154 和第 1167 行。 <code class="note">注意</code>: "jump" 列的数字指示你用 <code class="keystroke">CTRL-O</code> 或 <code class="keystroke">CTRL-I</code> 到该位置
所需的次数。

如果你用跳转命令，当前的行号被插到跳转表的最后。如果相同的行已经在跳转表里，那
会被删除。结果是，<code class="keystroke">CTRL-O</code> 就会直接回到该行之前的位置。

如果用了  <a href="motion.html#:keepjumps">:keepjumps</a>  命令修饰符，跳转就不会保存在跳转表里。一些其它场合也不保
存跳转，例如在  <a href="repeat.html#:global">:global</a>  命令里。你可以用 "m'" 设置 ' 位置标记来显式加入跳转。
<code class="note">注意</code> 调用 setpos() 做不到这一点。

在 <code class="keystroke">CTRL-O</code> 命令之后，你到了第 1154 行。如果你给出另外一个跳转命令 (比如，"G")，
那么跳转表就会成为:

<code class="section">    jump line  col file/text </code>
<code class="section">      4   1    0 一些文字 </code>
<code class="section">      3  70    0 另外一行 </code>
<code class="section">      2  1167    0 foo bar </code>
<code class="section">      1  1154   23 end. </code>
<code class="section">   &gt; </code>

删除和插入行以后，行号会得到调整。不过，如果不保存文件而放弃编辑，例如 ":n!"，
该调整会失败。

如果你分割一个窗口，跳转表会复制到新的窗口里。

如果在 <a href="options.html#'viminfo'">'viminfo'</a> 选项里有 ' 项，跳转表会保存在 viminfo 文件里。这样，重新启动
Vim 就会恢复跳转表。


改 变 表 跳 转                          <b class="vimtag"> <a name="changelist">changelist</a> </b> <b class="vimtag"> <a name="change-list-jumps">change-list-jumps</a> </b> <b class="vimtag"> <a name="E664">E664</a> </b>

改变文本后，光标的位置被记住。每个改变都会记住一个位置，从而可以使该操作能被撤
销。除非，这个位置和前一个改变很接近。可以用两个命令跳转到改变所在的位置，包括
那些已被撤销的:

                                                        <b class="vimtag"> <a name="g;">g;</a> </b> <b class="vimtag"> <a name="E662">E662</a> </b>
g;                      转到改变表里第 <code class="special">[count]</code> 个较旧的位置。
                        如果 <code class="special">[count]</code> 比所有的较旧的改变位置都多，回到最老的那
                        个。
                        如果没有较旧的改变，给出一个错误消息。
                        (不是动作命令)

                                                        <b class="vimtag"> <a name="g,">g,</a> </b> <b class="vimtag"> <a name="E663">E663</a> </b>
g,                      转到改变表里第 <code class="special">[count]</code> 个较新的位置。
                        和  <a href="motion.html#g;">g;</a>  类似，但朝向相反的方向。
                        (不是动作命令)

使用次数的时候你向后或向前跳转到尽可能接近该次数的位置。这样，你可以用 "999g;"
跳到还能记住的最初的改变所在的位置。改变的最大项目数和跳转表  <a href="motion.html#jumplist">jumplist</a>  一致。

当两个可以撤销的改变在同一行，并且所在的列差小于 <a href="options.html#'textwidth'">'textwidth'</a>，只有后一个会被记
住。这可以避免同一行里一系列很小的改变，例如 "xxxxx"，在改变表里占据很多位置。
如果 <a href="options.html#'textwidth'">'textwidth'</a> 为 0，则使用 <a href="options.html#'wrapmargin'">'wrapmargin'</a>。如果它也没有设置，就用固定的数目
79。细节: 考虑到速度的影响，计算用的是字节数而不是字符数 (这只对多字节编码有意
义)。

请 <code class="note">注意</code> 如果后来有插入和删除文本，尤其删除整行的时候，光标位置和当时改变的位置
可能稍有不同。

使用  <a href="motion.html#:keepjumps">:keepjumps</a>  命令修饰符时，不记住改变的位置。

                                                        <b class="vimtag"> <a name=":changes">:changes</a> </b>
:changes                打出改变表。"&gt;" 字符指示当前的位置。在一个改变之后，它
                        在最新的一项之后，这意味着  <a href="motion.html#g;">g;</a>  会带你到最新一项的位
                        置。第一列则指示要到该位置需要的次数。例如:

<code class="section">                                change line  col text </code>
                                    3     9    8 bla bla bla
                                    2    11   57 foo is a bar
                                    1    14   54 最新改变的行
                                
<code class="example"></code>
<code class="example">                        `3g;` 命令会带你到第 9 行。这时，`:changes` 的结果是:</code>
<code class="example"></code>
<code class="example">                                change line  col text ~</code>
<code class="example">                                &gt;   0     9    8 bla bla bla</code>
<code class="example">                                    1    11   57 foo is a bar</code>
<code class="example">                                    2    14   54 最新改变的行</code>
<code class="example"></code>
<code class="example">                        现在你可以用 "g," 到第 11 行，"2g," 到第 14 行。</code>
<code class="example"></code>
</section><hr class="doubleline" /><section class=inner>
<h4>9. 其他动作                                     <b class="vimtag"> <a name="various-motions">various-motions</a> </b></h4>
                                                        <b class="vimtag"> <a name="%">%</a> </b>
%                       找到本行的光标所在或其后的下一个项目，并跳转到它的匹
                        配。
                         <a href="motion.html#inclusive">inclusive</a>  闭动作。
                        项目可以是:
                        ([<code class="special">{}</code>])          小括号或者 (花/方) 括号。
                                        (这可以用 <a href="options.html#'matchpairs'">'matchpairs'</a> 选项改变)
                        /* */           C-风格的注释的开始或结尾
                        #if、#ifdef、#else、#elif、#endif
                                        C 预处理条件宏 (光标在 # 上，或者其后
                                        没有 ([{ 的时候)
                        要匹配其它的项目，可用 matchit 插件，参见
                         <a href="usr_05.html#matchit-install">matchit-install</a> 。此插件也可用于跳过注释中的匹配。

                        如果 <a href="options.html#'cpoptions'">'cpoptions'</a> 包含 "M"  <a href="options.html#cpo-M">cpo-M</a> ，忽略括号之前的反斜
                        杠。不然，括号之前的反斜杠的数目就有关系。带偶数数目的
                        不能匹配带奇数数目的。所以，在 "( \) )" 和 "\( ( \)"
                        里，第一个和最后一个小括号互相匹配。

                        如果 <a href="options.html#'cpoptions'">'cpoptions'</a> 里没有 '%' 字符  <a href="options.html#cpo-%">cpo-%</a> ，忽略双引号里
                        的括号，除非一行里的括号数目不对称，而且该行和前一行不
                        以反斜杠结尾。也忽略 '('、'{'、'['、']'、'}' 和 ')' 里
                        的 (单引号里的括号，等等)。 <code class="note">注意</code> 这对 C 适用，但对
                        Perl 就不行。Perl 里单引号用来括起字符串。

                        对注释中的匹配并无特殊处理。可以用 matchit 插件
                         <a href="usr_05.html#matchit-install">matchit-install</a>  或者用引号括起匹配。

                        这里不能用计数，<code class="special">{count}</code>% 跳转到文件里百分之 <code class="special">{count}</code> 的
                        那行  <a href="motion.html#N%">N%</a> 。
                        在 #if/#else/#endif 上用 % 使该动作面向行。

                                                <b class="vimtag"> <a name="[(">[(</a> </b>
[(                      反向第 <code class="special">[count]</code> 个的未匹配的 '('。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                <b class="vimtag"> <a name="[{">[{</a> </b>
[{                      反向第 <code class="special">[count]</code> 个的未匹配的 '{'。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                <b class="vimtag"> <a name="])">])</a> </b>
])                      正向第 <code class="special">[count]</code> 个的未匹配的 ')'。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                <b class="vimtag"> <a name="]}">]}</a> </b>
]}                      正向第 <code class="special">[count]</code> 个的未匹配的 '}'。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。

以上四个命令用于转到当前代码块的开始或者结尾位置。这和在 '('、')'、'{' 或 '}'
上用 "%" 类似，但你可以在代码块的任何位置这么做，这对 C 程序很有用。例如: 在
"case x:" 上用 "[{" 会把你带回到 switch 语句上。

                                                <b class="vimtag"> <a name="]m">]m</a> </b>
]m                      正向第 <code class="special">[count]</code> 个方法 (method) 的开始处 (适用于 Java
                        或类似结构的语言)。如果不在某个方法开始处之前，则跳转
                        到类的开始或结束处。如果光标之后已无 '{'，会有一个错
                        误。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。
                                                <b class="vimtag"> <a name="]M">]M</a> </b>
]M                      正向第 <code class="special">[count]</code> 个方法的结束处 (适用于 Java 或类似结构
                        的语言)。如果不在某个方法开始处之前，则跳转到类的开始
                        或结束处。如果光标之后已无 '}'，会有一个错误。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。
                                                <b class="vimtag"> <a name="[m">[m</a> </b>
[m                      反向第 <code class="special">[count]</code> 个方法的开始处 (适用于 Java 或类似结构
                        的语言)。如果不在某个方法开始处之前，则跳转到类的开始
                        或结束处。如果光标之前已无 '{'，会有一个错误。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。
                                                <b class="vimtag"> <a name="[M">[M</a> </b>
[M                      反向第 <code class="special">[count]</code> 个方法的结束处 (适用于 Java 或类似结构
                        的语言)。如果不在某个方法开始处之前，则跳转到类的开始
                        或结束处。如果光标之前已无 '}'，会有一个错误。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。

以上四个命令假设文件包含一个有方法的类定义。类定义用 '{' 和 '}' 包围，而方法定
义亦然。Java 语言便是如此。源文件看起来应像这样: 
<code class="example"></code>
<code class="example">        // 注释</code>
<code class="example">        class foo {</code>
<code class="example">                int method_one() {</code>
<code class="example">                        body_one();</code>
<code class="example">                }</code>
<code class="example">                int method_two() {</code>
<code class="example">                        body_two();</code>
<code class="example">                }</code>
<code class="example">        }</code>
<code class="example"></code>
[要试一下，先把这段文本复制到新缓冲区，不然以上的帮助文本会混淆跳转命令]

开始，光标在 "body_two()" 上，用 "[m" 会跳转到 "method_two()" 开始的那个 '{'
(显然，如果方法定义很长，这就更有用！)。用 "2[m" 会跳转到 "method_one()" 的开
始处。用 "3[m" 会跳转到类的开始处。

                                                <b class="vimtag"> <a name="[%23">[#</a> </b>
[#                      反向第 <code class="special">[count]</code> 个未匹配的 "#if" 或 "#else"。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                <b class="vimtag"> <a name="]%23">]#</a> </b>
]#                      正向第 <code class="special">[count]</code> 个未匹配的 "#else" 或 "#endif"。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。

这两个命令对有 #if/#else/#endif 结构的 C 程序很有用。它们把你带到当前行所在的
#if/#else/#endif 的开始或结束处。然后，你可以用 "%" 找到相匹配的行。

                                                <b class="vimtag"> <a name="[star">[star</a> </b> <b class="vimtag"> <a name="[%2F">[/</a> </b>
[*  或  [/              反向第 <code class="special">[count]</code> 个 C 注释的开始 "/*"。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。

                                                <b class="vimtag"> <a name="]star">]star</a> </b> <b class="vimtag"> <a name="]%2F">]/</a> </b>
]*  或  ]/              正向第 <code class="special">[count]</code> 个 C 注释的结束 "*/"。
                         <a href="motion.html#exclusive">exclusive</a>  开动作。


                                                <b class="vimtag"> <a name="H">H</a> </b>
H                       到窗口从顶部 (Home) 算第 <code class="special">[count]</code> 行 (缺省: 窗口的首行)
                        并停在首个非空白字符上。 <a href="motion.html#linewise">linewise</a>  行动作。参见
                        <a href="options.html#'startofline'">'startofline'</a> 选项。光标还要根据 <a href="options.html#'scrolloff'">'scrolloff'</a> 调整，除
                        非某个操作符处于等待状态，那时文本可能会滚动。例如
                        "yH" 从首个可见行抽起，直到光标所在行为止 (闭区间)。

                                                <b class="vimtag"> <a name="M">M</a> </b>
M                       到窗口的中间 (Middle) 一行并停在首个非空白字符。
                         <a href="motion.html#linewise">linewise</a>  行动作。参见 <a href="options.html#'startofline'">'startofline'</a> 选项。

                                                <b class="vimtag"> <a name="L">L</a> </b>
L                       到窗口从底部 (Last) 算第 <code class="special">[count]</code> 行 (缺省: 窗口的末行)
                        并停在首个非空白字符上。 <a href="motion.html#linewise">linewise</a>  行动作。参见
                        <a href="options.html#'startofline'">'startofline'</a> 选项。光标还要根据 <a href="options.html#'scrolloff'">'scrolloff'</a> 调整，除
                        非某个操作符处于等待状态，那时文本可能会滚动。例如
                        "yL" 从光标所在行抽起，直到最末的可见行为止 (包含)。

<code class="special">&lt;LeftMouse&gt;</code>             到屏幕上鼠标点击的位置。 <a href="motion.html#exclusive">exclusive</a>  开动作。参见
                         <a href="visual.html#%3CLeftMouse%3E">&lt;LeftMouse&gt;</a> 。如果鼠标在状态行上，则所属的窗口被激活
                        但光标位置不改变。

 vim:tw=78:ts=8:noet:ft=help:norl:
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
